package com.china08.yxyapi.util.algorithm;

import java.math.BigDecimal;
import java.util.List;

/**
 * 分数数据计算算法
 * 
 */
public class ScoreAlgorithm {

    /*
     * BigDecimal bd = new BigDecimal(results); return bd.setScale(2,
     * BigDecimal.ROUND_HALF_UP).doubleValue();
     */

    /**
     * 平均分：X = ∑ Xi / N （平均分 = 分数和 / 总人数）
     * 
     * @param scoreLst
     *            分数集合
     * @return
     */
    public static double scoreAvg(List<Double> scoreLst) {
        double scoreCount = 0d;
        for (Double score : scoreLst) {
            scoreCount += score;
        }
        if (scoreLst.size() == 0) { return 0d; }
        BigDecimal bd = new BigDecimal(scoreCount / scoreLst.size());
        return bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 得分率：∑ Xi / ∑ai （分数和/总分和）
     * 
     * @param scoreLst
     *            分数集合
     * @param fullMarks
     *            上限总分
     * @return
     */
    /*
     * public static double obtainScoreAvg(List<Double> scoreLst, double
     * fullMarks) { double scoreCount = 0d, fullMarksCount = 0d; for (Double
     * score : scoreLst) { scoreCount += score; fullMarksCount += fullMarks; }
     * if (fullMarksCount == 0) { return 0d; } return scoreCount /
     * fullMarksCount; }
     */

    /**
     * 标准差：σ= √ ∑(X-μ) ^2/ N（ 标准差 = √[（ 学生1得分 - 试卷平均分 ）² + ……+（ 学生N得分 - 试卷平均分
     * ）²] / 总人次 ）
     * 
     * @param scoreLst
     *            分数集合
     * @param avgScore
     *            平均分
     * @return
     */
    public static double standardDeviation(List<Double> scoreLst, double avgScore) {
        double count = 0d;
        for (Double score : scoreLst) {
            count += Math.pow((score - avgScore), 2);
        }
        if (scoreLst.size() == 0) { return 0d; }
        return Math.pow(count / scoreLst.size(), 1.0 / 2);
    }

    /**
     * 标准分: z = （x - μ）/ σ (标准分数 = （原始分数 - 平均数） / 标准差)
     * 
     * @param score
     *            原始分数
     * @param avgScore
     *            平均数
     * @param standardDeviation
     *            标准差
     * @return
     */
    public static double standardScore(double score, double avgScore, double standardDeviation) {
        if (standardDeviation == 0) { return 0d; }
        return (score - avgScore) / standardDeviation;
    }

    /**
     * 转化后标准分
     * 
     * @param standardScore
     *            标准分
     * @return
     */
    public static double conversionStandardScore(double standardScore) {
        return 500 + 100 * standardScore;
    }

    /**
     * 试题的难度 di = 1 - xi / ai （第i题题目难度 = 1 - 成绩均值 / 满分值）
     * 
     * @param scoreLst
     *            数据集合
     * @param fullMarks
     *            满分分数
     * @return
     */
    public static double itemDifficulty(List<Double> scoreLst, double fullMarks) {
        double count = 0d;
        for (Double score : scoreLst) {
            count += score;
        }
        if (scoreLst.size() == 0) { return 0d; }
        return count / scoreLst.size() / fullMarks;
    }

    /**
     * 试卷的难度 d = ∑aidi / ∑ai（试卷难度 = （第一题满分值*难度值 + …… +第N题满分值*难度值） / 第一题满分值
     * +……+第N题满分值）
     * 
     * @param itemDifficultyLst
     *            试题难度集合
     * @param fullMarks
     *            满分数据集合
     * @return
     */
    public static double testDifficulty(List<Double> itemDifficultyLst, List<Double> fullMarks) {
        double count = 0d, fullCount = 0d;
        for (int i = 0; i < itemDifficultyLst.size(); i++) {
            count += itemDifficultyLst.get(i) * fullMarks.get(i);
            fullCount += fullMarks.get(i);
        }
        if (fullCount == 0) { return 0d; }
        return count / fullCount;
    }

}
